package h0804;

import java.util.*;

/**
 * @author 不知名帅哥
 * @version 1.0
 * @description 最长子字符串的长度 II
 * @date 2024/8/4 11:15
 */
public class LongestSubStringLengthII {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int res = getResult(s);
        System.out.println(res);
    }

    private static int getResult(String s) {
        //记录状态，map
        //如果i-最早索引大于字符串长度，越界，应该尝试次小的最早索引。
        Map<Integer, LinkedList<Integer>> map = new HashMap<>();

        LinkedList<Integer> value = new LinkedList<>();
        value.add(-1); ///000 初始状态
        map.put(0, value);

        int maxLen = 0;
        int lcount = 0;
        int ocount = 0;
        int xcount = 0;
        for (int i = 0; i < 2 * s.length(); i++) {
            //第二轮需要取余
            char c = s.charAt(i % s.length());
            if (c == 'l') {
                lcount++;
            } else if (c == 'o') {
                ocount++;
            } else if (c == 'x') {
                xcount++;
            }

            int status = lcount % 2 << 2 | ocount % 2 << 1 | xcount % 2;

            //TODO 两次状态相等中间的字符串就是一个符合要求子串，比如lololo 11 ->(3%2)(3%2)
            if (map.get(status) != null) {
                LinkedList<Integer> list = map.get(status);
                list.add(i);
                while (!list.isEmpty()) {
                    //TODO 如果使用队列记录某个状态出现的所有位置（按照先后顺序依次记录），
                    // 那么队列头部记录的就是该状态的最早出现位置，如果该位置被侵蚀，那么我们就弹出队头，
                    // 使用新的队头元素作为对应状态的最早出现位置。
                    Integer index = list.peekFirst();
                    //如果越界了，取次小的最早索引。
                    if (i - index > s.length()) {
                        list.removeFirst();
                    } else {
                        maxLen = Math.max(maxLen, i - index);
                        break;
                    }
                }
            } else {
                //第一次出现，
                LinkedList<Integer> list = new LinkedList<>();
                list.add(i);
                map.put(status, list);
            }
        }
        return maxLen;
    }

}
